/*
 * Titulo: DoublyList.java
 * Autor: Oswaldo Ceballos Zavala
 * Descripcion: Lista doblemente ligada parametrizada.
 * 
 * Universidad Autonoma de Yucatan
 * 
 */
package aerodromo.util.estructurasDatos.lista;

/**
 *
 * @author Oswaldo.C, Diego Martínez
 */
public class DoublyList<T> 
        extends List<T>{

    @Override
    public void insertAtFirst(T element) {
       
       if ( isEmpty() ){
      
          DoublyListNode<T> nuevo = new DoublyListNode<T>(element);
          firstNode = lastNode = nuevo;
       }
       else{
            
          DoublyListNode<T> nuevo = new DoublyListNode(element , null , (DoublyListNode<T>)firstNode ); 
          ((DoublyListNode<T>)firstNode).setPrev(nuevo);
          firstNode = nuevo;
       }
       
       tam++;
    }

    @Override
    public void insertAtLast(T element) {
        
        if ( isEmpty() ){
            
          DoublyListNode<T> nuevo = new DoublyListNode<T>(element);
          firstNode = lastNode = nuevo;
        }
        else{
            DoublyListNode<T> nuevo = new DoublyListNode(element , (DoublyListNode<T>)lastNode , null );
            lastNode.setSiguiente(nuevo);
            lastNode = nuevo;
        }
        
        tam++;
        
    }

    @Override
    public T removeFromFisrt() throws EmptyListException {
        
        //si la lista esta vacia
        if ( isEmpty() ){
            throw new EmptyListException(); 
        }
        
        T removedItem = firstNode.data;
        
        //la lista tiene un elemento
        if ( firstNode == lastNode ){
           firstNode = lastNode = null;    
        }
        else{
           firstNode = firstNode.getSiguiente(); 
        }
        
        tam--;
        return removedItem;
    }

    @Override
    public T removeFromLast() throws EmptyListException {
        
        //si la lista esta vacia
        if ( isEmpty() ){
            throw new EmptyListException(); 
        }
        
        T removedItem = lastNode.data;
        
        //la lista tiene un solo elemento
        if ( firstNode == lastNode ){
            firstNode = lastNode = null;
        }
        //la lista tiene mas de un elemento
        else{
            lastNode = ((DoublyListNode)lastNode).getPrev();
        }
        
        
        tam--;
        return removedItem;
    }

        @Override
    public T obtenerdeIndice(int indice) {
        ListNode<T> current = lastNode;
        while(indice!=0){
            current= current.getSiguiente();
            indice--;
        }
        return (T) current;
    }
    
    
} //fin clase DoublyList
